package com.luxsoft.siipap.em.replica.dao;

import java.sql.Types;
import java.text.NumberFormat;
import java.util.List;

import org.springframework.jdbc.core.JdbcTemplate;

import com.luxsoft.siipap.model.Periodo;
import com.luxsoft.siipap.service.ServiceLocator2;

/**
 * Acceso a informacion relacionada con Ventas en SW Ex 
 * 
 * @author Ruben Cancino
 *
 */
public class SWVentasDao {
	
	private final JdbcTemplate jdbcTemplate;
	
	public SWVentasDao(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	/**
	 * Busca el numero de registros determinados por el 
	 * 
	 * @param p
	 * @return
	 */
	public int buscarRegistrosVentas(final Periodo periodo){
		
		List<Periodo> meses=Periodo.periodosMensuales(periodo);
		int res=0;
		for(Periodo p:meses){
			int mesReg=0;
			String sql="SELECT COUNT(*) FROM SW_VENTAS WHERE YEAR=? AND MES=? AND FECHA BETWEEN ? AND ? ";
			Object args[]={
					Periodo.obtenerYear(p.getFechaFinal())
					,Periodo.obtenerMes(p.getFechaFinal())+1
					,periodo.getFechaInicial()
					,periodo.getFechaFinal()
					};
			int[] types={Types.NUMERIC,Types.NUMERIC,Types.DATE,Types.DATE};
			mesReg+=jdbcTemplate.queryForInt(sql,args,types);
			System.out.println("Mes  SW_VENTAS: "+p+" \t Registros: "+mesReg);
			res+=mesReg;
		}		
		return res;
	}
	
	/**
	 * Busca el importe de las ventas en el periodo
	 * 
	 * @param periodo
	 * @return
	 */
	public double buscarImporteDeVentas(final Periodo periodo){
		List<Periodo> meses=Periodo.periodosMensuales(periodo);
		double res=0;
		for(Periodo p:meses){
			
			double mes=0;
			Number mres=new Double(0);
			
			String sql="SELECT SUM(IMPORTEBRUTO) FROM SW_VENTAS WHERE YEAR=? AND MES=? AND FECHA BETWEEN ? AND ? ";
			Object args[]={
					 Periodo.obtenerYear(p.getFechaFinal())
					,Periodo.obtenerMes(p.getFechaFinal())+1
					,periodo.getFechaInicial()
					,periodo.getFechaFinal()
					};
			int[] types={Types.NUMERIC,Types.NUMERIC,Types.DATE,Types.DATE};	
			mres=(Number)jdbcTemplate.queryForObject(sql,args,types,Number.class);			
			if(mres!=null)
				mes+=mres.doubleValue();
			
			System.out.println("Mes  SW_VENTAS:"+p+" \t Importe: "+mes);
			
			res+=mes;
		}		
		return res;
	}
	
	/**
	 * Busca el numero de registros determinados por el 
	 * 
	 * @param p
	 * @return
	 */
	public int buscarRegistrosVentasDet(final Periodo periodo){
		List<Periodo> meses=Periodo.periodosMensuales(periodo);
		int res=0;
		for(Periodo p:meses){			
			int mesReg=0;
			int year=Periodo.obtenerYear(p.getFechaFinal());
			int mes=Periodo.obtenerMes(p.getFechaFinal())+1;
			String sql="SELECT COUNT(A.VENTADET_ID) FROM SW_VENTASDET A JOIN SW_VENTAS B ON (A.VENTA_ID=B.VENTA_ID) WHERE B.YEAR=? AND B.MES=? AND B.FECHA BETWEEN ? and ?";
			Object args[]={year,mes,periodo.getFechaInicial(),periodo.getFechaFinal()};
			int[] types={Types.NUMERIC,Types.NUMERIC,Types.DATE,Types.DATE};	
			mesReg+=jdbcTemplate.queryForInt(sql,args,types);
			System.out.println("Mes SW_VENTASDET: "+p+" \t Registros: "+mesReg);
			res+=mesReg;
		}		
		return res;
	}
	
	public double buscarCantidadEnVentasDet(final Periodo periodo){
		List<Periodo> meses=Periodo.periodosMensuales(periodo);
		double res=0;
		for(Periodo p:meses){
			
			double currentMes=0;
			Number mres=new Double(0);
			
			int year=Periodo.obtenerYear(p.getFechaFinal());
			int mes=Periodo.obtenerMes(p.getFechaFinal())+1;
			String sql="SELECT SUM(A.CANTIDAD*FACTORUNI) FROM SW_VENTASDET A JOIN SW_VENTAS B ON (A.VENTA_ID=B.VENTA_ID) WHERE B.YEAR=? AND B.MES=? AND B.FECHA BETWEEN ? and ?";
			Object args[]={year,mes,periodo.getFechaInicial(),periodo.getFechaFinal()};
			int[] types={Types.NUMERIC,Types.NUMERIC,Types.DATE,Types.DATE};		
			mres=(Number)jdbcTemplate.queryForObject(sql,args,types,Number.class);
			if(mres!=null)
				currentMes+=mres.doubleValue();
			
			System.out.println("Mes: "+p+" \t Importe SW_VENTASDET: "+currentMes);
			
			res+=currentMes;
		}		
		return res;
	}
	
	public static void main(String[] args) {
		SWVentasDao dao=new SWVentasDao(ServiceLocator2.getAnalisisJdbcTemplate());
		Periodo p=new Periodo("01/01/2008","31/10/2008");
		int registros=dao.buscarRegistrosVentas(p);
		System.out.println("Total Registros Ventas: "+registros);
		double importe=dao.buscarImporteDeVentas(p);		
		System.out.println("Total Importe Ventas: "+NumberFormat.getCurrencyInstance().format(importe));
		
		registros=dao.buscarRegistrosVentasDet(p);
		System.out.println("Total Registros VentasDet: "+registros);
		importe=dao.buscarCantidadEnVentasDet(p);
		System.out.println("Total Cantidad VentasDet: "+NumberFormat.getNumberInstance().format(importe));
	}

}
